from urllib.parse import urlencode
from flask import jsonify
from flask import current_app as bot
import requests
import json
import threading
import time

class Circle(threading.Thread):
    def __init__(self, interval, func):
        threading.Thread.__init__(self)
        self.interval = interval
        self.func = func

    def run(self):
        while True:
            self.func()
            print('interval', self.interval)
            time.sleep(self.interval)


def send_text_msg(robot_wxid, to_wxid, msg):
    ''' 发送文本消息
            包括群消息, 好友消息
    '''
    ret = {
        'type': 'send_text_msg',
        'robot_wxid': robot_wxid,
        'to_wxid': to_wxid,
        'msg': msg
    }
    return call_bot(ret)

def send_group_at_msg(robot_wxid, to_wxid, at_wxid, at_name, msg):
    ''' 发送群消息并艾特某人 '''
    ret = {
        'type': 'send_group_at_msg',
        'robot_wxid': robot_wxid,
        'to_wxid': to_wxid,
        'at_wxid': at_wxid,
        'at_name': at_name,
        'msg': msg
    }
    return call_bot(ret)

def send_image_msg(robot_wxid, to_wxid, path):# 默认是本地文件
    ''' 发送图片消息 '''
    ret = {
        'type': 'send_image_msg',
        'robot_wxid': robot_wxid,
        'to_wxid': to_wxid,
        'path': path
    }
    return call_bot(ret)

def send_video_msg(robot_wxid, to_wxid, path):
    ''' 发送视频消息 '''
    ret = {
        'type': 'send_video_msg',
        'robot_wxid': robot_wxid,
        'to_wxid': to_wxid,
        'path': path
    }
    return call_bot(ret)

def send_file_msg(robot_wxid, to_wxid, path):
    ''' 发送文件消息 '''
    ret = {
        'type': 'send_file_msg',
        'robot_wxid': robot_wxid,
        'to_wxid': to_wxid,
        'path': path
    }
    return call_bot(ret)

def send_emoji_msg(robot_wxid, to_wxid, path):
    ''' 发送动态表情 '''
    ret = {
        'type': 'send_emoji_msg',
        'robot_wxid': robot_wxid,
        'to_wxid': to_wxid,
        'path': path
    }
    return call_bot(ret)

def send_link_msg(robot_wxid, to_wxid, title, text, target_url, pic_url, icon_url):
    ''' 发送分享链接 '''
    ret = {
        'type': 'send_link_msg',
        'robot_wxid': robot_wxid,
        'to_wxid': to_wxid,
        'title': title,
        'text': text,
        'target_url': target_url,
        'pic_url': pic_url,
        'icon_url': icon_url
    }
    return call_bot(ret)

def send_music_msg(robot_wxid, to_wxid, name, music_type):
    ''' 发送音乐消息 '''
    ret = {
        'type': 'send_music_msg',
        'robot_wxid': robot_wxid,
        'to_wxid': to_wxid,
        'name': name,
        "music_type": music_type, # 0 随机模式 1 网易云音乐 2 酷狗音乐
    }
    return call_bot(ret)

def accept_transfer(robot_wxid, friend_wxid, json_string):
    ''' 接收好友转账 '''
    ret = {
        'type': 'accept_transfer',
        'robot_wxid': robot_wxid,
        'friend_wxid': friend_wxid,
        'msg': json_string # 转账事件原消息
    }
    return call_bot(ret)

def agree_group_invite(robot_wxid, json_string):
    ''' 同意群聊邀请 '''
    ret = {
        'type': 'agree_group_invite',
        'robot_wxid': robot_wxid,
        'msg': json_string # 转账事件原消息
    }
    return call_bot(ret)

def agree_friend_verify(robot_wxid, json_string):
    ''' 同意好友请求 '''
    ret = {
        'type': 'agree_friend_verify',
        'robot_wxid': robot_wxid,
        'msg': json_string # 转账事件原消息
    }
    return call_bot(ret)

def modify_friend_note(robot_wxid, friend_wxid, note):
    ''' 修改好友备注

    '''
    ret = {
        'type': 'modify_friend_note',
        'robot_wxid': robot_wxid,
        'friend_wxid': friend_wxid,
        'note': note # 新备注（空字符串则是删除备注）
    }
    return call_bot(ret)

def delete_friend(robot_wxid, friend_wxid):
    ''' 删除好友 '''
    ret = {
        'type': 'delete_friend',
        'robot_wxid': robot_wxid,
        'friend_wxid': friend_wxid
    }
    return call_bot(ret)

def remove_group_member(robot_wxid, group_wxid, member_wxid):
    ''' 踢出群成员 '''
    ret = {
        'type': 'remove_group_member',
        'robot_wxid': robot_wxid,
        'group_wxid': group_wxid,
        'member_wxid': member_wxid
    }
    return call_bot(ret)

def modify_group_name(robot_wxid, group_wxid, group_name):
    ''' 修改群名称 '''
    ret = {
        'type': 'modify_group_name',
        'robot_wxid': robot_wxid,
        'group_wxid': group_wxid,
        'group_name': group_name
    }
    return call_bot(ret)

def modify_group_notice(robot_wxid, group_wxid, notice):
    ''' 修改群公告 '''
    ret = {
        'type': 'modify_group_notice',
        'robot_wxid': robot_wxid,
        'group_wxid': group_wxid,
        'notice': notice
    }
    return call_bot(ret)

def building_group(robot_wxid, friends):
    ''' 建立新群 '''
    ret = {
        'type': 'building_group',
        'robot_wxid': robot_wxid,
        'friends': friends # 好友id数组, 用|分隔的wxid文本
    }
    return call_bot(ret)

def quit_group(robot_wxid, group_wxid):
    ''' 退出群聊 '''
    ret = {
        'type': 'quit_group',
        'robot_wxid': robot_wxid,
        'group_wxid': group_wxid
    }
    return call_bot(ret)

def invite_in_group(robot_wxid, group_wxid, friend_wxid):
    ''' 邀请加入群聊 '''
    ret = {
        'type': 'invite_in_group',
        'robot_wxid': robot_wxid,
        'group_wxid': group_wxid,
        'friend_wxid': friend_wxid
    }
    return call_bot(ret)

# 以下用 dll 搭建http服务器来提供回调, 主动模式


def get_robot_name(robot_wxid):
    ''' 取指定登录账号的昵称 
    @return     string         昵称
    中文乱码，暂未查明原因
    '''
    ret = {
        'type': 'get_robot_name',
        'robot_wxid': robot_wxid
    }
    return call_bot_2_get(ret, False)

def get_robot_headimgurl(robot_wxid):
    ''' 取指定登录账号的头像
    @return     string         头像网址
    无返回值，正在排查
     '''
    ret = {
        'type': 'get_robot_headimgurl',
        'robot_wxid': robot_wxid
    }
    return call_bot_2_get(ret, False)

def get_logged_account_list(bot):
    ''' 取登录账号列表
    @return     list[dict]         帐号列表
     '''
    ret = {
        'type': 'get_logged_account_list'
    }
    return call_bot_2_get(ret)

def get_friend_list(robot_wxid, is_refresh=0):
    ''' 取好友列表
    @return     list[dict]         好友列表
     '''
    ret = {
        'type': 'get_friend_list',
        'robot_wxid': robot_wxid, # 账户id（可选, 如果填空字符串, 即取所有登录账号的好友列表, 反正取指定账号的列表）
        'is_refresh': is_refresh # 是否刷新列表，0 从缓存获取 / 1 重新获取
    }
    return call_bot_2_get(ret)

def get_group_list(robot_wxid, is_refresh=0):
    ''' 取群聊列表
    @return     list[dict]         群列表
     '''
    ret = {
        'type': 'get_group_list',
        'robot_wxid': robot_wxid, # 账户id（可选, 如果填空字符串, 即取所有登录账号的好友列表, 反正取指定账号的列表）
        'is_refresh': is_refresh # 是否刷新列表，0 从缓存获取 / 1 重新获取
    }
    return call_bot_2_get(ret)

def get_group_member(robot_wxid, group_wxid, member_wxid, is_refresh=0):
    ''' 取群成员资料
    @return     dict         群成员资料
     '''
    ret = {
        'type': 'get_group_member',
        'robot_wxid': robot_wxid, # 账户id（可选, 如果填空字符串, 即取所有登录账号的好友列表, 反正取指定账号的列表）
        'group_wxid': group_wxid,
        'member_wxid': member_wxid,
        'is_refresh': is_refresh # 是否刷新列表，0 从缓存获取 / 1 重新获取
    }
    return call_bot_2_get(ret)

def get_group_member_list(robot_wxid, group_wxid, is_refresh=0):
    ''' 取群成员列表 
    @return     list[dict]         群成员(含资料)列表
    暂时不可用，还未查明原因
    '''
    ret = {
        'type': 'get_group_member_list',
        'robot_wxid': robot_wxid, # 账户id（可选, 如果填空字符串, 即取所有登录账号的好友列表, 反正取指定账号的列表）
        'group_wxid': group_wxid,
        'is_refresh': is_refresh # 是否刷新列表，0 从缓存获取 / 1 重新获取
    }
    return call_bot_2_get(ret)

def call_bot_2_get(param_dic, is_json=True):
    param = urlencode(param_dic)
    host, port = bot.config['BOT_HOST'], bot.config['BOT_PORT']
    url = f"{host}:{port}?{param}"
    if is_json: return requests.get(url).json()
    return requests.get(url).text

# def _call_bot(param_dic):
#     param_dic = {'data': [param_dic], 'code': 200}
#     param = json.dumps(param_dic)
#     host, port = bot.config['BOT_HOST'], bot.config['BOT_PORT']
#     requests.get(f"{host}:{port}?data={param}")

def call_bot(param_dic, only_uuid=1):
    host, port = bot.config['BOT_HOST'], bot.config['BOT_PORT']
    if only_uuid:
        uuid = max(bot.ret_msg_dict) + 1
        bot.ret_msg_dict[uuid] = [param_dic]
        ret = f"{host}:{port}?only_uuid=1&uuid={uuid}"
    else:
        param = json.dumps({'data': [param_dic], 'code': 200})
        ret = f"{host}:{port}?data={param}"
    threading.Thread(target=lambda ret: requests.get(ret), args=[ret]).start()
    # bot.sendQueue.put(ret)
    # send_msg()

# def send_msg():
#     while bot.sendQueue.qsize():
#         ret = bot.sendQueue.get()
#         threading.Thread(target=lambda ret: requests.get(ret), args=[ret]).start()

def call_bot_force(param_dic):
    host, port = bot.config['BOT_HOST'], bot.config['BOT_PORT']
    param = json.dumps({'data': [param_dic], 'code': 200})
    ret = f"{host}:{port}?data={param}"
    if len(ret) > 1000: return call_bot(param_dic) # 文本过长还是要用uuid, 这个上限还没测试，暂用 1000
    threading.Thread(target=lambda ret: requests.get(ret), args=[ret]).start()
